

/**
 * 从Cube MX 生成的代码尽量不修改放在旁边，方便以后调整配置。
 * Cube 生成的main.c 直接复制粘贴过来，然后用python 脚本自动修改，
 * 将其中的main 函数改名为hal_main，以免与cpp 文件中定义的main 函数冲突。
 * 可以直接调用hal_main 运行配置代码。
 */


#include <stm32f1xx_hal.h>

#include <hal_systick_counter.hpp>
#include <pin/cm_f1.hpp>
#include <scheduler_basic.hpp>

extern "C" {

extern int hal_main();
}


using TimeSource = scheduler_basic::HalSysTickMsSource;
using TimeType = TimeSource::TimeType;


extern CRC_HandleTypeDef hcrc;

extern I2C_HandleTypeDef hi2c1;

extern UART_HandleTypeDef huart1;

extern PCD_HandleTypeDef hpcd_USB_FS;


const ioxx::Pin SCK_LED_PIN(GPIOA, 5);  // LED 引脚和SCK 是同一个


void setup() {
    // 先直接调用Cube 生成的main 函数初始化外设
    hal_main();

    __enable_irq();


    // 使能所有GPIO 的时钟
    ioxx::enable_gpio();

    using namespace ioxx;

    // 配置LED 引脚
    ioxx::PinInit()
        .mode(mode::out)
        .drive(drive::push_pull)
        .init(SCK_LED_PIN);
}


volatile uint32_t m;

int main() {
    setup();

    scheduler_basic::TimeCycle<TimeSource> c;

    while (1) {
        if (c.cycle(200)) {
            SCK_LED_PIN.toggle();
        }
    }
}